/*
============================================================================
 Name        : dd_fixed_queue.h
 Author      : Jian
 Version     :
 Copyright   : GPL
 Description : dd_fixed_queue.h - header file
============================================================================
*/

#ifndef DD_FIXED_QUEUE_H
#define DD_FIXED_QUEUE_H

/* INCLUDES */
#include "dd_define.h"
#include "sd_platform.h"

__DD_BEGIN_DECLS

/* 
* The fixed size queue implement with concurrent logic
*/
typedef struct __dd_fixed_queue dd_fixed_queue ;
typedef void dd_queue_value ;
/* if you want to deque the value of queue, just return value != 0 */
typedef int dd_fqueue_handle_value(dd_queue_value* val) ;


struct __dd_fixed_queue {
    dd_queue_value**  data ;
    DD_UINT           maxCount ; 
    DD_UINT           count ;
    DD_UINT           head ;
    sd_semp*          lock ;
} ;

dd_fixed_queue* dd_fqueue_create(DD_UINT maxCount, int supConc) ;

void dd_fqueue_destroy(dd_fixed_queue* queue, void (*free_fun)(void*)) ;

int dd_fqueue_enqueue(dd_fixed_queue* queue, dd_queue_value* value) ;

dd_queue_value* dd_fqueue_dequeue(dd_fixed_queue* queue) ;

/* return the value that handler function return */
int dd_fqueue_try_dequeue(dd_fixed_queue* queue, dd_fqueue_handle_value* handler) ;

void dd_fqueue_reset(dd_fixed_queue* queue, void (*free_fun)(void*)) ;

DD_BOOL dd_fqueue_count(const dd_fixed_queue* queue) ;

#ifdef __DD_TEST

int dd_fqueue_test() ;

#endif

__DD_END_DECLS

#endif  /* DD_FIXED_QUEUE_H */

/* End of File */
